<?php

class UsersController extends AppController {

    var $name = 'Users';

    function beforeFilter() {
        $this->Auth->autoRedirect = false;
        $this->Auth->allow('add');
    }

    function login() {
        $this->__aux_login();
    }

    function admin_login() {
        $this->__aux_login();
    }

    /**
     * Permite iniciar sesión
     */
    function __aux_login() {
        $this->layout = 'login';
        if ($this->Auth->user()) {
            //si es admin
            if ($this->Auth->user('group_id') == 1) {
                $this->redirect(array('controller' => 'obras', 'action' => 'admin_mapa', 'admin' => true));
            } else {

            }
        }
        $this->render('login');
    }

    function logout() {
        $this->__aux_logout();
    }

    function admin_logout() {
        $this->__aux_logout();
    }

    /**
     * Permite cerrar sesión
     */
    function __aux_logout() {
        $this->redirect($this->Auth->logout());
    }

    function index($group_id = null, $user_id = null) {
        $this->__aux_index($group_id, $user_id);
    }

    function admin_index($group_id = null, $user_id = null) {
        $this->__aux_index($group_id, $user_id);
    }

    /**
     * Lista todos los usuarios
     */
    function __aux_index($group_id = null, $user_id = null) {
        $this->User->recursive = 0;
        $this->paginate['order'] = 'User.username';

        if ($this->Session->check('id_obra'))
            $this->Session->delete('id_obra');

        if ($this->Session->check('id_evaluacione'))
            $this->Session->delete('id_evaluacione');

        if ($this->Session->check('id_intervencione'))
            $this->Session->delete('id_intervencione');

        $lista_usuarios = array();
        $condiciones = array();
        $nombre = '';

        $grupos = $this->User->Group->find('list', array('fields' => array('Group.id', 'Group.name'), 'order' => 'Group.name'));
        //$grupos = array();
        $grupos['0'] = 'Todos';
        //$group_id = (!empty($group_id)) ? $group_id : '';


        if (!empty($group_id)) {
            $this->data['User']['group_id'] = $group_id;
            $lista_usuarios = $this->User->find('list', array('conditions' => array('User.group_id' => $group_id),
                                'fields' => array('User.id', 'User.username'), 'order' => 'User.username'));
            $lista_usuarios[0] = 'Todos';
            $group_id = (!empty($group_id)) ? $group_id : '';
        }

        if (!empty($user_id)) {
            $this->data['User']['user_id'] = $user_id;
        }

        //si vienen datos del filtro
        if (!empty($this->data)) {

            if (!empty($this->data['User']['group_id'])) {
                $condiciones[] = "User.group_id = {$this->data['User']['group_id']}";
            }

            if (!empty($this->data['User']['group_id']) || ($this->data['User']['group_id'] == '0')) {
                $group_id = $this->data['User']['group_id'];
                $this->Session->write('group_id', $group_id);
            }

            if (isset($this->data['User']['user_id']) && !empty($this->data['User']['user_id'])) {
                $condiciones[] = "User.id = {$this->data['User']['user_id']}";
            }

            if ((isset($this->data['User']['user_id'])) && (!empty($this->data['User']['user_id']) || ($this->data['User']['user_id'] == '0'))) {
                $user_id = $this->data['User']['user_id'];
                if (!empty($this->data['User']['group_id'])) {
                    $lista_usuarios = $this->User->find('list', array('conditions' => array('User.group_id' => $this->data['User']['group_id']),
                                'fields' => array('User.id', 'User.username'), 'order' => 'User.username'));
                } else {
                    $lista_usuarios = $this->User->find('list', array('fields' => array('User.id', 'User.username'), 'order' => 'User.username'));
                }
                $lista_usuarios[0] = 'Todos';
                $this->Session->write('user_id', $user_id);
                $this->Session->write('lista_usuarios', $lista_usuarios);
            }

            if (!empty($this->data['User']['nombre'])) {
                $usuario = utf8_encode(strtolower(utf8_decode(trim($this->data['User']['nombre']))));
                $condiciones[] = "lower(User.username) LIKE '%{$usuario}%'";
                $nombre = $this->data['User']['nombre'];
                $this->Session->write('nombre', $nombre);
            }

            $this->Session->write('usuarios_filter', $condiciones);
        } elseif ($this->Session->check('usuarios_filter')) {//si tengo cargado un filtro en session
            //me fijo si esta cambiando de pagina o cambiando el limit
            if (isset($this->params['named']['limit']) || isset($this->params['named']['page'])) {
                //si ya estaba siendo aplicado un filtro, lo sigo usando
                $condiciones = $this->Session->read('usuarios_filter');
                $group_id = ($this->Session->check('group_id')) ? $this->Session->read('group_id') : '';
                $user_id = ($this->Session->check('user_id')) ? $this->Session->read('user_id') : '';
                $lista_usuarios = ($this->Session->check('lista_usuarios')) ? $this->Session->read('lista_usuario') : array();
                $nombre = ($this->Session->check('nombre')) ? $this->Session->read('nombre') : '';
            } else {
                //sino, lo borro de la session
                $this->Session->delete('usuarios_filter');
                $this->Session->delete('group_id');
                $this->Session->delete('user_id');
                $this->Session->delete('lista_usuarios');
                $this->Session->delete('nombre');
            }
        }

        $this->paginate['conditions'] = $condiciones;
        $referer = $this->referer();
        $this->set(compact('grupos', 'group_id', 'user_id', 'lista_usuarios', 'nombre', 'referer'));
        $this->set('users', $this->paginate());
        $this->render('index');
    }

    function view_usuarios_filtro($group_id = null) {
        $this->__aux_view_usuarios_filtro($group_id);
    }

    function admin_view_usuarios_filtro($group_id = null) {
        $this->__aux_view_usuarios_filtro($group_id);
    }

    function __aux_view_usuarios_filtro($group_id = null) {
        $this->layout = false;
        $lista_usuarios = array();
        if (!empty($group_id)) {
            $lista_usuarios = $this->User->find('list', array('conditions' => array('User.group_id' => $group_id),
                        'fields' => array('User.id', 'User.username'), 'order' => 'User.username'));
        } else {
            $lista_usuarios = $this->User->find('list', array('fields' => array('User.id', 'User.username'), 'order' => 'User.username'));
        }
        $lista_usuarios[0] = 'Todos';
        $this->set(compact('lista_usuarios'));
        $this->render('view_usuarios_filtro');
    }

    function delete($id = null) {
        $this->__aux_delete($id);
    }

    function admin_delete($id = null) {
        $this->__aux_delete($id);
    }

    /**
     * Eliminar un usuario seleccionado
     * @param <type> $id
     */
    function __aux_delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Usuario Inválido', true), 'flash_failure');
        } else {
            $user = $this->User->find('all', array('conditions' => array('User.id' => $id)));
            if (!empty($user)) {
                if ($this->User->delete($id)) {
                    $this->Session->setFlash(__('El usuario se eliminó correctamente.', true), 'flash_success');
                } else {
                    $this->Session->setFlash(__('El usuario no se pudo eliminar. Por favor, intente nuevamente.', true), 'flash_failure');
                }
            } else {
                $this->Session->setFlash(__('Usuario Inválido', true), 'flash_failure');
            }
        }
        $this->redirect(array('action' => 'index'));
    }

    function add($group_id = null) {
        $this->__aux_add($group_id);
    }

    function admin_add($group_id = null) {
        $this->__aux_add($group_id);
    }

    /**
     * Permite dar de alta un nuevo usuario
     */
    function __aux_add($group_id = null) {
        $group_id = (!empty ($group_id)) ? $group_id : '';

        if ($this->Session->check('id_obra'))
            $this->Session->delete('id_obra');

        if ($this->Session->check('id_evaluacione'))
            $this->Session->delete('id_evaluacione');

        if ($this->Session->check('id_intervencione'))
            $this->Session->delete('id_intervencione');

        if (!empty($this->data)) {
            $username = utf8_encode(strtolower(utf8_decode(trim($this->data['User']['username']))));

            if (!empty($this->data['User']['username']) && !empty($this->data['User']['password']) && !empty($this->data['User']['group_id'])) {
                $group_id = $this->data['User']['group_id'];
                $user = $this->User->find('all', array('conditions' => array('lower(User.username)' => $username, 'User.group_id' => $group_id)));

                if (empty($user)) {
                    $this->User->create();
                    if ($this->User->save($this->data)) {
                        $user_id = $this->User->id;
                        $this->Session->setFlash(__('El usuario se guardó correctamente.', true), 'flash_success');
                        $this->redirect(array('action' => 'index', $group_id, $user_id));
                    } else {
                        $this->Session->setFlash(__('El usuario no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                    }
                } else {
                    $this->Session->setFlash(__('El nombre de usuario ya existe.', true), 'flash_failure');
                }
            } else {
                $this->Session->setFlash(__('El usuario no se pudo guardar. Faltan datos requeridos. Por favor, intente nuevamente.', true), 'flash_failure');
            }
        }
        $groups = $this->User->Group->find('list');
        $referer = $this->referer();
        $this->set(compact('groups', 'group_id', 'referer'));
        $this->render('add');
    }

    function edit($id = null) {
        $this->__aux_edit($id);
    }

    function admin_edit($id = null) {
        $this->__aux_edit($id);
    }

    /**
     * Permite editar un usuario seleccionado
     * @param <type> $id
     */
    function __aux_edit($id = null) {
        if (empty($id) && empty($this->data)) {
            $this->Session->setFlash(__('Usuario Inválido', true), 'flash_failure');
            $this->redirect(array('action' => 'index'));
        } elseif (empty($this->data)) {
            $this->data = $this->User->read(null, $id);
            $group_id = $this->data['User']['group_id'];
        } elseif (!empty($this->data)) {
            // Verifico si la contraseña actual es correcta.
            $pass_actual = $this->User->find('all', array('conditions' => array('User.id' => $this->data['User']['id'], 'User.password' => $this->data['User']['password'])));
            $group_id = $this->data['User']['group_id'];
            if (!empty($pass_actual)) {
                // Verifico si la nueva contraseña y su confirmación coinciden
                if ($this->data['User']['new_password'] == $this->data['User']['confirm_new_password']) {
                    $this->data['User']['password'] = $this->Auth->password($this->data['User']['new_password']);
                    $username = utf8_encode(strtolower(utf8_decode(trim($this->data['User']['username']))));
                    $user = $this->User->find('all', array('conditions' => array('User.id <>' => $this->data['User']['id'], 'User.username' => $username)));

                    if (empty($user)) {
                        if ($this->User->save($this->data)) {
                            $this->Session->setFlash(__('El usuario se guardó correctamente.', true), 'flash_success');
                            $this->redirect(array('action' => 'index', $group_id, $id));
                        } else {
                            $this->Session->setFlash(__('El usuario no se pudo guardar. Por favor, intente nuevamente.', true), 'flash_failure');
                        }
                    } else {
                        $this->Session->setFlash(__('El nombre de usuario ya existe.', true), 'flash_failure');
                    }
                } else {
                    $this->Session->setFlash(__('La contraseña y su confirmación deben coincidir.', true), 'flash_failure');
                }
            } else {
                $this->Session->setFlash(__('La contraseña actual no es correcta.', true), 'flash_failure');
            }
        }

        $groups = $this->User->Group->find('list');
        $referer = $this->referer();
        $this->set(compact('groups', 'group_id', 'referer'));
        $this->render('edit');
    }

}
?>